﻿// ----------------------------------------------------------------------------------------
// Author:                    Joaquín López y Magally Vargas
// Company:                   Albalia Interactiva S.L
// Assembly version:          1.0.0.0
// Date:                      10/02/2009
// Time:                      12:08
// Solution Name:             FacturaeAdd-in
// Solution Filename:         FacturaeAdd-in.sln
// Solution FullFilename:     C:\Ribbon_Facturae\FacturaeAdd-in.sln
// Project Name:              FacturaeAdd-in
// Project Filename:          FacturaeAdd-in.csproj
// Project FullFilename:      C:\Ribbon_Facturae\FacturaeAdd-in\FacturaeAdd-in.csproj
// Project Item Name:         FrmValidation.cs
// Project Item Filename:     FrmValidation.cs
// Project Item FullFilename: C:\Ribbon_Facturae\FacturaeAdd-in\FrmValidation.cs
// Project Item Kind:         Formulario
// Purpose:                   Mostrar la información de la validacion de una factura
//Copyright © 2008 - 2009 Albalia Interactiva S.L. Reservados todos los derechos.
// ----------------------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using Org.BouncyCastle.Tsp;

namespace FacturaeAdd_in
{
    /// <summary>
    /// Formulario que muestra los resultado de la validación de una factura,
    /// ya sea en papel, en cuyo caso solo muestra información de esquema y contable,
    /// electrónica con firma EPES, además informacin de firma y certificado,
    /// o electrónica XL donde además se muestra información del sello de tiempo y OCSP.
    /// </summary>
    public partial class FrmValidation : Form
    {

        #region "Fields"

        /// <summary>
        /// Campo de tipo XmlDocument el cual contiene la factura.
        /// </summary>
        XmlDocument doc;
        
        /// <summary>
        /// Campo de tipo string que contendrá el error de la validación contable si existiera
        /// </summary>
        string errorAccount = "";

        /// <summary>
        /// Campo de tipo string que contendrá el error de la validación de firma si existiera
        /// </summary>
        string errorSigned = "";

        /// <summary>
        /// Campo que hace referencia al sello de tiempo.
        /// </summary>
        TimeStampToken tst = null;

        #endregion

        #region "Constructors"

        /// <summary>
        /// Constructor que inicializa todos los componentes gráficos del formulario.
        /// </summary>
        public FrmValidation()
        {
            InitializeComponent();
        }

        #endregion 

        #region "Public Methods"

        /// <summary>
        /// Método que se encarga de mostrar los resultado de la validación
        /// </summary>
        /// <param name="schema">Parámetro de tipo bool que indica si se ha producido error en la validación de esqema.</param>
        /// <param name="account">Parámetro de tipo bool que indica si se ha producido error en la validación contable.</param>
        /// <param name="sign">Parámetro de tipo bool que indica si se ha producido error en la validación de firma.</param>
        /// <param name="infoSchema">Parámetro de tipo string que contiene la información sobre la validación de esquema.</param>
        /// <param name="infoAccount">Parámetro de tipo string que contiene la información sobre la validación contable.</param>
        /// <param name="errorAccount">Parámetro de tipo string que contiene los errores de la validación contable.</param>
        /// <param name="infoSigned">Parámetro de tipo string que contiene la información sobre la validación de firma.</param>
        /// <param name="errorSigned">Parámetro de tipo string que contiene los errores de la validación de firma.</param>
        /// <param name="infoSignedType">Parámetro de tipo string que contiene el tipo de firma</param>
        /// <param name="infoIssue">Parámetro de tipo string que contiene los datos del emisor</param>
        /// <param name="infoSubject">Parámetro de tipo string que contiene los datos del cliente</param>
        /// <param name="infoCertificateStatus">Parámetro de tipo string que contiene información sobre el estado del certificado</param>
        /// <param name="xmlDoc">Parámetro de tipo XmlDocument sobre el que se realiza la validación</param>
        /// <param name="tst">Parámetro de tipo string que contiene información sobre el sello de tiempo</param>
        /// <param name="ocsp">Parámetro de tipo string que contiene información sobre el OCSP</param>
        /// <param name="statusOCSP">Parámetro de tipo string que contiene información sobre el estado del OCSP</param>
        /// <param name="viewOCSP">Parámetro de tipo bool que indica si se muestra el contenido del OCSP o no</param>
        /// <param name="isEpes">Parámetro de tipo bool que indica si el tipo de firma es EPES o no.</param>
        public void setImages(bool schema, bool account, bool sign, string infoSchema, string infoAccount, string errorAccount, string infoSigned, string errorSigned, string infoSignedType, string infoIssue, string infoSubject, string infoCertificateStatus, XmlDocument xmlDoc,TimeStampToken tst,string ocsp,string statusOCSP,bool viewOCSP,bool isEpes)
        {
            if (schema)
                pctbSchema.Image = global::FacturaeAdd_in.Properties.Resources.ok;
            else
                pctbSchema.Image = global::FacturaeAdd_in.Properties.Resources.fail;
            if (account)
                pctbAccount.Image = global::FacturaeAdd_in.Properties.Resources.ok;
            else
            {
                pctbAccount.Image = global::FacturaeAdd_in.Properties.Resources.fail;
                this.errorAccount = errorAccount;
                btnViewAccountDetails.Visible = true;
            }
            if (sign)
                pctbSign.Image = global::FacturaeAdd_in.Properties.Resources.ok;
            else
            {
                pctbSign.Image = global::FacturaeAdd_in.Properties.Resources.fail;
                if (account)
                {
                    this.errorSigned = errorSigned;
                    btnViewSignedDetails.Visible = true;
                }
            }
            lbInfoSchemaValidation.Text = infoSchema;
            lbInfoAccountValidation.Text = infoAccount;
            lbInfoSigned.Text = infoSigned;
            lbSignedType.Text = infoSignedType;
            lbInfoIssue.Text = infoIssue;
            lbInfoSubject.Text = infoSubject;
            lbCertificateStatus.Text = infoCertificateStatus;
            if (xmlDoc == null)
                btnCert.Enabled = false;
            else
                this.doc = xmlDoc;
            this.tst = tst;
            txtOCSP.Text = ocsp;
            txtStatusOCSP.Text = statusOCSP;
            if (isEpes) 
            {
                gbxOCSPTS.Visible = false;
                gbxValidation.Height = gbxValidation.Height - gbxOCSPTS.Height;
                this.btnOk.Location = new System.Drawing.Point(btnOk.Location.X, btnOk.Location.Y-gbxOCSPTS.Height);
                this.Height = this.Height - gbxOCSPTS.Height;
                
            }
            if (!viewOCSP)
            {
                gbxOCSPTS.Visible = false;
                int ant = gbxValidation.Height;
                gbxValidation.Height = lbSing.Location.Y;
                this.btnOk.Location = new System.Drawing.Point(btnOk.Location.X, btnViewSignedDetails.Location.Y);
                pctbSign.Visible = false;
                lbSing.Visible = false;
                this.Height = this.Height - (ant-gbxValidation.Height);
            }

        }

        /// <summary>
        /// Método que carga el archivo de idioma y establece los textos de los controles
        /// en el idioma que corresponde.
        /// </summary>
        public void LoadLanguage()
        {
            try
            {
                Language labels = Language.getInstance();
                this.Text = labels.getLabels(this.Name);
                gbxValidation.Text = labels.getLabels(gbxValidation.Name);
                lbSchema.Text = labels.getLabels(lbSchema.Name);
                lbAccount.Text = labels.getLabels(lbAccount.Name);
                lbSing.Text = labels.getLabels(lbSing.Name);
                lbViewCertificate.Text = labels.getLabels(lbViewCertificate.Name);
                btnOk.Text = labels.getLabels(btnOk.Name);
                btnViewAccountDetails.Text = labels.getLabels(btnViewAccountDetails.Name);
                btnViewSignedDetails.Text = labels.getLabels(btnViewSignedDetails.Name);
                gbxOCSPTS.Text = labels.getLabels(gbxOCSPTS.Name);
                lbTS.Text = labels.getLabels(lbTS.Name);
                btnTS.Text = labels.getLabels(btnTS.Name);
                lbOCSP.Text = labels.getLabels(lbOCSP.Name);
                lbStatusOCSP.Text = labels.getLabels(lbStatusOCSP.Name);
            }
            catch (Exception)
            {
                ControlMessages msg = ControlMessages.getInstance();
                MessageBox.Show(msg.getMessage(ControlMessages.Msg.ErrorLoadLanguage), msg.getMessage(ControlMessages.Msg.CaptionConfig), MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

        }

        #endregion

        #region "Private Methods"

        /// <summary>
        /// Método que maneja el evento que se produce al hacer click con el ratón sobre el botón de aceptar.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnOk_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        /// <summary>
        /// Método que maneja el evento que se produce al mostrarse el formulario.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FrmValidation_Load(object sender, EventArgs e)
        {
            LoadLanguage();
        }

        
        /// <summary>
        /// Método que maneja el evento que se produce al hacer click con el ratón sobre el botón del certificado.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            Xades.XadesSignature s = new Xades.XadesSignature();
            s.MostrarCertifiacdo(doc);
        }

        /// <summary>
        /// Método que maneja el evento que se produce al hacer click con el ratón sobre el botón de ver detalles
        /// de la validacion contable.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnViewAccountDetails_Click(object sender, EventArgs e)
        {
            FrmViewDetails f = new FrmViewDetails();
            f.AddError(errorAccount);
            f.ShowDialog();
        }

        /// <summary>
        /// Método que maneja el evento que se produce al hacer click con el ratón sobre el botón de ver detalles
        /// de la validacion de firma.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnViewSignedDetails_Click(object sender, EventArgs e)
        {
            FrmViewDetails f = new FrmViewDetails();
            f.AddError(errorSigned);
            f.ShowDialog();
        }

        /// <summary>
        /// Método que maneja el evento que se produce al hacer click con el ratón sobre el botón de ver sello de tiempo
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click_1(object sender, EventArgs e)
        {
            if (tst != null)
            {
                FrmTimeStampTokenViewer TSTV = new FrmTimeStampTokenViewer(tst);
                TSTV.Show();
            }
            else
            {
                MessageBox.Show("No se ha obtenido TSR de la TSA");
            }
        }

        #endregion
    }
}
